const jwt = require('jsonwebtoken');
const pool = require('../config/db');
require('dotenv').config();


/**
 * 中间件1：验证用户是否已登录（所有需要登录的接口都需添加）
 * 逻辑：从请求头获取Token → 验证Token有效性 → 解析用户信息并添加到req.user
 */
const protect = async (req, res, next) => {
  let token;

  // 1. 从请求头获取Token（格式：Authorization: Bearer <token>）
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
    token = req.headers.authorization.split(' ')[1];  // 提取Bearer后的Token
  }

  // 2. 检查Token是否存在
  if (!token) {
    return res.status(401).json({ message: '未授权访问，请先登录' });
  }

  try {
    // 3. 验证Token有效性（解密Token）
    const decoded = jwt.verify(token, process.env.JWT_SECRET);

    // 4. 根据Token中的用户ID查询数据库，获取最新用户信息
    const [users] = await pool.query(
      'SELECT id, username, role FROM users WHERE id = ?',
      [decoded.id]  // decoded.id是Token中存储的用户ID
    );

    // 5. 检查用户是否存在（避免Token有效但用户已被删除的情况）
    if (users.length === 0) {
      return res.status(401).json({ message: '用户不存在，请重新登录' });
    }

    // 6. 将用户信息添加到req对象，后续控制器可通过req.user获取
    req.user = users[0];
    next();  // 放行，进入下一个中间件/控制器
  } catch (error) {
    console.error('Token验证失败：', error.message);
    return res.status(401).json({ message: 'Token无效或已过期，请重新登录' });
  }
};

/**
 * 中间件2：验证用户是否为管理员（仅管理员接口需添加）
 * 逻辑：检查req.user.role是否为'admin'
 */
const admin = (req, res, next) => {
  if (req.user && req.user.role === 'admin') {
    next();  // 是管理员，放行
  } else {
    res.status(403).json({ message: '禁止访问，需要管理员权限' });  // 无权限
  }
};

// 导出中间件（供路由使用）
module.exports = { protect, admin };